Node affinity定義了結點的親和性,讓pod能夠優先的被排到理想中的node上運行;
Taints
(污點)的目的則是完全相反,他讓pod不可以被部署至特定節點,若在資源不足(或是不得不部署pod在這些 node )時,則以Toleration
(容忍度)來做依據分配pod到這些node上
我們可以歸類出幾個重點
Taints:中定義出節點的污點,即不可部署到這個 pod 的幾個key
Toleration:定義節點的容忍度,設置容忍度可允許 pod 部署到有設置的節點上,若無設置容忍度
有幾個類似情境便可以使用Taint
Taint
、Toleration
利用指令kubectl taint
即可在 node 上標示Taint
kubectl taint nodes node1 key=value:noSchedule
也要記得在pod的spec中定義toleration,才可讓Taints生效
tolerations:
- key: "key"
operator: "Equal"
value: "value"
effect: "NoSchedule"
也可採用以下寫法:
tolerations:
- key: "key"
operator: "Exists"
effect: "NoSchedule"
Equal
Exists
(存在)Equal
且 value
相等Exists
能夠讓所有的key都符合NoSchedule
:若某個 node 留下的 taint 的 effect 為 NoSchedule
,就不會把pod部署到node上,不影響執行中的podPreferNoSchedule
:若某個 node 留下的 taint 的 effect 為 PreferNoSchedule
,就儘量不把pod部署到node上,但還是可能被部署到他上面,不影響執行中的podNoExecute
:若某個node被設定了 NoExecute
,若此 node 上已有此 taint 的 pod 會立刻被驅逐,也不會把這個pod再分配到該node上
TolerationSeconds
,可表示在 taint 被增加後,帶有該 torleration 的 pod 可以存留多久一個 pod 可以設置多個 Toleration,並針對實際環境作出對應,以下變有幾個情境:
在部署環境中可能會遇見以下的類似情境,我們便可以利用taint和toleration的特性來應對這些情形
kubectl taint nodes nodename forspecial=groupName:NoSchedule
利用 taint 設定 forspecial 為特定的 groupName,其他的groupName的pod便不會被規劃到這個 node 上,僅有設有 toleration 的 pod 才可以部署
like GPU運算加速等等的
kubectl taint nodes nodename gpu=true:NoSchedule
kubectl taint nodes nodename fpga=true:NoSchedule
概念和上一個小節一樣,利用NoSchedule
、PreferNoSchedule
來讓一般 pod 僅量不部署到這些 node
故障的節點可能會影響整體服務的運行,維運者可以透過設定 taint 讓 k8s 接手 pod 退出 node 的程序,讓服務不受影響
設置指令跟上面一樣因此就不提了,但因為以下的問題滿常遇到的,因此 k8s 有個自動化的功能叫TaintBasedEvictions
會自動設定了下列的taint來對應處理這些問題,且預設TolerationSeconds
為300,讓 Taint產生時不會使未設定 Toleration 的 pod 立刻被驅除
node.kubernetes.io/not-ready:Node is not ready
node.kubernetes.io/unreachable:node controller 無法聯繫到該 node
node.kubernetes.io/disk-pressure:磁碟空間快要耗盡
node.kubernetes.io/unschedulable:無法分派 pod 到該 node
node.cloudprovider.kubernetes.io/uninitialized:node 尚未初始化完成,還無法使用 (這是給 public cloud provider 用的 taint)
若要啟用TaintBaseEvictions,記得要打開他的feature gate喔!
最後有一個要注意的是,在設定pod退出node時要小心同時若有多個pod退出有可能會引起cluster的崩潰,因此要好好設想toleration的時間以及NoExecute的條件是否過於嚴格的問題!